package com.wangshili.sys.service.Impl;

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.wangshili.common.exception.ServiceException;
import com.wangshili.pojo.common.vo.SysZTreeNode;
import com.wangshili.pojo.sys.entity.SysMenu;
import com.wangshili.sys.dao.SysMenuDao;
import com.wangshili.sys.dao.SysRoleMenuDao;
import com.wangshili.sys.service.SysMenuService;

/**
 * 菜单页面服务层
 * @author wangshili
 *
 */
@Service
public class SysMenuServiceImpl implements SysMenuService {
	private static final Logger log =
			LoggerFactory.getLogger(SysMenuServiceImpl.class);
	/**
	 * 注入菜单管理持久层接口
	 */
	@Autowired
	private SysMenuDao sysMenuDao;
	/**
	 * 注入菜单与角色表关系持久层接口
	 */
	@Autowired
	private SysRoleMenuDao sysMenuRolesDao;
	
	/**
	 * 操作接口层，查找菜单全部数据
	 */
	@Override
	public List<Map<String, Object>> findPageObject() {

		List<Map<String, Object>> findPageObject = 
				sysMenuDao.findPageObject();
		//校验
		if(findPageObject==null || findPageObject.size()==0) {
			log.debug("未找到菜单数据");
			throw new ServiceException("未找到数据");
		}
//		
//		for(Map<String, Object> s:findPageObject) {
//			Set<String> keySet = s.keySet();//获取key集合
//			for(String key: keySet) {
//				System.out.println("key:"+key+" value:"+s.get(key));
//			}
//		}

		return findPageObject;
	}
	
	/**
	 * 根据菜单id，先判断是否有子节点，如果有就提示先删除子节点，如果没有就执行删除
	 * 需要删除菜单和关系表
	 * 如果删除的行数为 0，则提示
	 */
	@Override
	public int deleteById(Integer id) {
		log.debug("删除操作，id="+id);
		if(id==null)throw new IllegalArgumentException("id不合法");
		//先判断是否存在子节点
		int rowsParent = countParentById(id);
		if(rowsParent>0)throw new ServiceException("请先删除子菜单");
		//删除关系表
		sysMenuRolesDao.deleteById(id);
		//删除菜单信息
		int rows = sysMenuDao.deleteById(id);
		if(rows<1)throw new ServiceException("此菜单可能已经不存在");
		return rows;
	}

	/**
	 * 统计子节点数量
	 */
	@Override
	public int countParentById(Integer id) {
		int rows = sysMenuDao.countParentById(id);
		return rows;
	}
	
	
	/**
	 * 查询当前节点的id、name和上级节点id信息
	 */
	@Override
	public List<SysZTreeNode> selectMenuNode() {
		List<SysZTreeNode> node = sysMenuDao.selectMenuNode();
		log.debug("查询上级菜单："+node.toString());
		return node;
	}
	
	/**
	 * 添加菜单
	 */
	@Override
	public int insertMenuObject(SysMenu entity) {
		//1.进行合法性校验
		if(entity==null)throw new ServiceException("保存的对象为空，错误!!!");
		if(StringUtils.isEmpty(entity.getName()))throw new ServiceException("保存的菜单名不能为空");
		//2.进行插入操作，捕获过程异常
		int rows = 0;
		try {
			entity.setCreatedTime(new Date());//插入时间
			entity.setModifiedTime(new Date());//修改时间默认和创建时间一样
			rows = sysMenuDao.insertMenuObject(entity);
		} catch (Exception e) {
			e.printStackTrace();
			throw new ServiceException("保存失败，请重试");
		}
		return rows;
	}
	
	/**
	 * 更新菜单
	 */
	@Override
	public int updateMenuObject(SysMenu entity) {
		//1.进行合法性校验
		if(entity==null)throw new ServiceException("修改的对象为空，错误!!!");
		if(StringUtils.isEmpty(entity.getName()))throw new ServiceException("修改的菜单名不能为空");
		int rows = 0;
		try {
			entity.setModifiedTime(new Date());//更新下时间
			rows = sysMenuDao.updateMenuObject(entity);
			if(rows<1)throw new ServiceException("该菜单记录可能已经不存在");
		} catch (Exception e) {
			e.printStackTrace();
			throw new ServiceException("更新失败,请重试");
		}

		return rows;
	}

}
